{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to use the Short Sequence-to-Point with NILMTK\n",
    "\n",
    "This is an example on how to train and use the Short Sequence-to-Point disaggregator on the [REDD](http://redd.csail.mit.edu/) dataset using [NILMTK](https://github.com/nilmtk/NILMTK/).\n",
    "\n",
    "This network is a variation of the short sequence-to-point architecture described here:\n",
    "\n",
    "The paper for the Short version is"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First of all, we need to train the ShortSeq2PointDisaggregator using the train data. For this example, both train and test data are consumption data of the microwave of the first REDD building."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import warnings; warnings.filterwarnings('ignore')\n",
    "\n",
    "from nilmtk import DataSet\n",
    "train = DataSet('redd.h5')\n",
    "train.set_window(end=\"30-4-2011\") #Use data only until 4/30/2011\n",
    "train_elec = train.buildings[1].elec"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we need to define the disaggregator model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv1d_1 (Conv1D)            (None, 100, 30)           330       \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 100, 30)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_2 (Conv1D)            (None, 100, 30)           7230      \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 100, 30)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_3 (Conv1D)            (None, 100, 40)           7240      \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 100, 40)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_4 (Conv1D)            (None, 100, 50)           10050     \n",
      "_________________________________________________________________\n",
      "dropout_4 (Dropout)          (None, 100, 50)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_5 (Conv1D)            (None, 100, 50)           12550     \n",
      "_________________________________________________________________\n",
      "dropout_5 (Dropout)          (None, 100, 50)           0         \n",
      "_________________________________________________________________\n",
      "flatten_1 (Flatten)          (None, 5000)              0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1024)              5121024   \n",
      "_________________________________________________________________\n",
      "dropout_6 (Dropout)          (None, 1024)              0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 1)                 1025      \n",
      "=================================================================\n",
      "Total params: 5,159,449\n",
      "Trainable params: 5,159,449\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "from shortseq2pointdisaggregator import ShortSeq2PointDisaggregator\n",
    "disaggregator = ShortSeq2PointDisaggregator(window_size=100)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then train the model. We need to input the train data as well as their sample period. Also, we need to pass the desired number of training epochs. Finally, save the model for later use."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "1002967/1002967 [==============================] - 228s - loss: 8.0571e-04   \n",
      "Epoch 2/5\n",
      "1002967/1002967 [==============================] - 213s - loss: 7.3260e-04   \n",
      "Epoch 3/5\n",
      "1002967/1002967 [==============================] - 210s - loss: 6.9686e-04   \n",
      "Epoch 4/5\n",
      "1002967/1002967 [==============================] - 210s - loss: 6.3350e-04   \n",
      "Epoch 5/5\n",
      "1002967/1002967 [==============================] - 209s - loss: 5.9427e-04   \n"
     ]
    }
   ],
   "source": [
    "train_mains = train_elec.mains().all_meters()[0] # The aggregated meter that provides the input\n",
    "train_meter = train_elec.submeters()['microwave'] # The microwave meter that is used as a training target\n",
    "\n",
    "disaggregator.train(train_mains, train_meter, epochs=5, sample_period=1)\n",
    "disaggregator.export_model(\"model-redd5.h5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that the model is trained, we can use it to disaggregate energy data. Let's test it on the rest of the data from building 1.\n",
    "\n",
    "First we use the model to predict the microwave consumption. The results are saved automatically in a .h5 datastore."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "New sensible chunk: 121482\n",
      "New sensible chunk: 112661\n",
      "New sensible chunk: 87770\n",
      "New sensible chunk: 54084\n",
      "New sensible chunk: 2660\n",
      "New sensible chunk: 33513\n",
      "New sensible chunk: 138535\n",
      "New sensible chunk: 32514\n",
      "New sensible chunk: 27255\n",
      "New sensible chunk: 34833\n",
      "New sensible chunk: 100831\n"
     ]
    }
   ],
   "source": [
    "test = DataSet('redd.h5')\n",
    "test.set_window(start=\"30-4-2011\")\n",
    "test_elec = test.buildings[1].elec\n",
    "test_mains = test_elec.mains().all_meters()[0]\n",
    "\n",
    "disag_filename = 'disag-out.h5' # The filename of the resulting datastore\n",
    "from nilmtk.datastore import HDFDataStore\n",
    "output = HDFDataStore(disag_filename, 'w')\n",
    "\n",
    "# test_mains: The aggregated signal meter\n",
    "# output: The output datastore\n",
    "# train_meter: This is used in order to copy the metadata of the train meter into the datastore\n",
    "disaggregator.disaggregate(test_mains, output, train_meter, sample_period=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot the results and compare them to the ground truth signal.\n",
    "\n",
    "**Note:** Calling plot this way, downsamples the signal to reduce computing time. To plot the entire signal call\n",
    "```\n",
    "predicted.power_series_all_data().plot()\n",
    "ground_truth.power_series_all_data().plot()\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\noQUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0df0492f10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = DataSet(disag_filename)\n",
    "res_elec = result.buildings[1].elec\n",
    "predicted = res_elec['microwave']\n",
    "ground_truth = test_elec['microwave']\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "predicted.plot()\n",
    "ground_truth.plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally let's see the metric results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "============ Recall: 0.0456918965636\n",
      "============ Precision: 0.805732687157\n",
      "============ Accuracy: 0.28334183468\n",
      "============ F1 Score: 0.0864796608023\n",
      "============ Relative error in total energy: 0.840686257358\n",
      "============ Mean absolute error(in Watts): 25.0217610209\n"
     ]
    }
   ],
   "source": [
    "import metrics\n",
    "rpaf = metrics.recall_precision_accuracy_f1(predicted, ground_truth)\n",
    "print(\"============ Recall: {}\".format(rpaf[0]))\n",
    "print(\"============ Precision: {}\".format(rpaf[1]))\n",
    "print(\"============ Accuracy: {}\".format(rpaf[2]))\n",
    "print(\"============ F1 Score: {}\".format(rpaf[3]))\n",
    "\n",
    "print(\"============ Relative error in total energy: {}\".format(metrics.relative_error_total_energy(predicted, ground_truth)))\n",
    "print(\"============ Mean absolute error(in Watts): {}\".format(metrics.mean_absolute_error(predicted, ground_truth)))"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:nilmtk-env]",
   "language": "python",
   "name": "conda-env-nilmtk-env-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
